package com.study.algorithm.binarytree;

import java.util.LinkedList;
import java.util.Queue;

public class MaxDepth {
    /**
     * 104. 二叉树的最大深度
     */
    //方法一：递归 深度优先
    public int maxDepth(TreeNode root) {
        // 递归终止条件：如果当前节点为空，深度为0
        if (root == null) {
            return 0;
        }

        // 1. 递归计算左子树的最大深度
        int leftDepth = maxDepth(root.left);

        // 2. 递归计算右子树的最大深度
        int rightDepth = maxDepth(root.right);

        // 3. 当前树的最大深度 = 1（当前节点） + 左右子树中更大的深度
        return Math.max(leftDepth, rightDepth) + 1;
    }

    //方法二：迭代 广度优先
    public int maxDepth1(TreeNode root) {
        if (root == null) {
            return 0;
        }

        // 使用队列进行BFS层次遍历
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root); // 将根节点加入队列
        int depth = 0; // 初始化深度计数器

        // 当队列不为空时，说明还有节点需要遍历
        while (!queue.isEmpty()) {
            int levelSize = queue.size(); // 当前层的节点数量
            depth++;
            // 遍历当前层的所有节点
            for (int i = 0; i < levelSize; i++) {
                TreeNode currentNode = queue.poll(); // 取出队首节点

                // 将当前节点的子节点加入队列（下一层）
                if (currentNode.left != null) {
                    queue.offer(currentNode.left);
                }
                if (currentNode.right != null) {
                    queue.offer(currentNode.right);
                }
            }
        }
        return depth;
    }
}
